(define (cddr s) (cdr (cdr s)))

(define (cadr s) (car (cdr s)))

(define (caddr s) (car (cddr s)))

(define (sign val)
  (cond 
    ((> val 0) 1)
    ((< val 0) -1)
    (#t        0)))

(define (square x) (* x x))

(define (pow base exp)
  (define (pow_b num_sf sq_sf rest)
    (cond 
      ((= rest 0)
       num_sf)
      ((even? rest)
       (pow_b num_sf
              (square sq_sf)
              (quotient rest 2)))
      (#t
       (pow_b (* num_sf sq_sf)
              (square sq_sf)
              (quotient rest 2)))))
  (pow_b 1 base exp))
